/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package proy1sistdistribuidos.modelo.seguridad;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * Clase que permite generar codigos de hash con el algoritmo SHA-512
 * @author Carlos Diaz Maya, Juan Felipe Garcia
 */
public class GeneradorCodigosHashSHA512 implements GeneradorCodigosHash {
    private String algoritmo = "SHA-512";
    private MessageDigest digest;
    private static GeneradorCodigosHashSHA512 solitario;

    private GeneradorCodigosHashSHA512() {
    }

    public static GeneradorCodigosHash obtenerSolitario() {
        if(solitario == null){
            solitario = new GeneradorCodigosHashSHA512();
        }
        return solitario;
    }

     /**
     * Fuente del metodo: http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html
     * Turns array of bytes into string
     *
     * @param buf	Array of bytes to convert to hex string
     * @return	Generated hex string
     */
     public static String asHex (byte buf[]) {
      StringBuffer strbuf = new StringBuffer(buf.length * 2);
      int i;

      for (i = 0; i < buf.length; i++) {
       if (((int) buf[i] & 0xff) < 0x10)
	    strbuf.append("0");

       strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
      }

      return strbuf.toString();
     }

    @Override
    public String generarCodigoHash(String cadena) throws NoSuchAlgorithmException {
        this.digest = MessageDigest.getInstance(algoritmo);
        byte[] cadenaBytes = cadena.getBytes();
        this.digest.update(cadenaBytes);
        byte[] hash = this.digest.digest();
        String hashString = asHex(hash);
        return hashString;
    }

    @Override
    public String generarCodigoHash(byte[] archivo) throws NoSuchAlgorithmException {
        this.digest = MessageDigest.getInstance(algoritmo);
        this.digest.update(archivo);
        byte[] hash = this.digest.digest();
        String hashString = asHex(hash);
        return hashString;
    }
}
